const axios = require('axios')
const cheerio = require('cheerio')
const puppeteer = require('puppeteer-core');
const {URL} = require('url')
const fs = require('fs')
const {clearCache} = require('./lib/fs')
// p-limit 本地下载失败
// const pLimit = require('p-limit')

const baseUrl = 'https://httpsok.com/'

// 限制并发请求数量
// const limit = pLimit(5) // 同时最多 5 个请求

// 目标网站的根域名
const visitedUrls = new Set() // 用于去重
const allData = [] // 存储爬取的数据

clearCache()
/**
 * 爬取单个页面
 * @param {string} url - 要爬取的页面 URL
 */
async function crawlPage(url,depth=0,maxDepth=5) {
 if (depth > maxDepth) return;
	if (visitedUrls.has(url)) return // 如果已经访问过，跳过
	visitedUrls.add(url) // 标记为已访问
 // 测试 50个地址，
 if(allData.length>50) return 

	try {
		console.log(`Crawling: ${url}`)
  let html = ''
  // 根据是否是spa页面，选择不同的方式获取html
  if(url.indexOf('httpsok')>-1){
    const browser = await puppeteer.launch({ 
     headless: true ,
     executablePath: 'C:/Program Files/Google/Chrome/Application/chrome.exe', // 指定 Chrome 的路径
     // userDataDir: '/path/to/cache', 
     ignoreHTTPSErrors: true, // 忽略 HTTPS 错误
     timeout: 30000, // 设置超时时间为 30 秒
    });
    const page = await browser.newPage();
    await page.goto(url, { waitUntil: 'networkidle2' });
  
    // 获取页面内容
    html = await page.content();
    await browser.close();
  }else{
   const response = await axios.get(url)
   html = response.data
  }
  // 使用 cheerio 解析 HTML
		const $ = cheerio.load(html)

		// 提取页面中的数据（示例：提取标题和正文）
		const title = $('title').text()
		const body = $('body').text().trim()
  let file = url.split('.com/')
  let fileName = file.length>1?file[1]:'index'
  fileName = fileName.replace(/[\\/]/g,'')
  fs.writeFileSync(`cache/${fileName}.json`, JSON.stringify({url, title, body}, null, 2))
		allData.push({url, title, body})

		// 提取页面中的所有链接
		const links = []
		$('a').each((index, element) => {
			const href = $(element).attr('href')
			if (href) {
				const absoluteUrl = new URL(href, baseUrl).href // 转换为绝对 URL
				if (absoluteUrl.startsWith(baseUrl)) {
					// 只爬取同一域名下的链接
					links.push(absoluteUrl)
				}
			}
		})

		// 递归爬取链接
		// await Promise.all(links.map(link => limit(() => crawlPage(link,depth + 1, maxDepth))))
		await Promise.all(links.map(link => crawlPage(link,depth + 1, maxDepth)))
	} catch (error) {
		console.error(`Failed to crawl ${url}:`, error.message)
	}
}

/**
 * 启动爬虫
 */
async function startCrawling() {
	await crawlPage(baseUrl) // 从首页开始爬取
	console.log('Crawling completed!')
	console.log('Total pages crawled:', visitedUrls.size)

	// 将数据保存到文件（可选）
	
	fs.writeFileSync('data.json', JSON.stringify(allData, null, 2))
	console.log('Data saved to data.json')
}

// 启动爬虫
startCrawling()
